package com.example.health_life.service;


import com.example.health_life.converter.UserConverter;
import com.example.health_life.dao.User;
import com.example.health_life.dao.UserRepository;
import com.example.health_life.dto.UsersDTO;
import com.example.health_life.util.WxApiUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Optional;

@Service
public  class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private WxApiUtil wxApiUtil;

    @Override
    public UsersDTO getUserById(Integer id) {
        User user = userRepository.findById(id).orElseThrow(RuntimeException:: new);
        return UserConverter.converterUsers(user);
    }

    @Override
    public int addUsers(UsersDTO usersDTO) {
        // 检查用户名是否存在
        if (usersDTO.getUsername() != null) {
            List<User> userList = userRepository.findByUsername(usersDTO.getUsername());
            if (!CollectionUtils.isEmpty(userList)) {
                throw new IllegalStateException("用户名已存在");
            }
        }
        
        // 检查手机号是否存在
        if (usersDTO.getPhone() != null) {
            Optional<User> existingUser = userRepository.findByPhone(usersDTO.getPhone());
            if (existingUser.isPresent()) {
                throw new IllegalStateException("手机号已存在");
            }
        }
        
        // 检查openid是否存在
        if (usersDTO.getOpenid() != null) {
            Optional<User> existingUser = userRepository.findByOpenid(usersDTO.getOpenid());
            if (existingUser.isPresent()) {
                throw new IllegalStateException("微信账号已绑定");
            }
        }

        User user = UserConverter.converterUsersDTO(usersDTO);
        user.setCreateTime(Instant.now());
        user.setLastLoginTime(Instant.now());
        
        // 如果是微信登录，设置默认密码
        if (user.getLoginType() == 2) {
            user.setPassword("wx_" + user.getOpenid());
        } else {
            user.setPassword("123456");
        }

        User savedUser = userRepository.save(user);
        return savedUser.getId();
    }

    @Override
    public int deleteUsers(int id) {
        // 查找用户，如果不存在则抛出异常
        User user = userRepository.findById(id).orElseThrow(() -> new IllegalStateException("用户不存在"));
        
        // 将用户状态更新为 -1（表示已删除）
        user.setStatus((byte) -1);
        // 保存更新后的用户信息
        userRepository.save(user);
        
        return id; // 返回被删除用户的ID
    }

    @Override
    public UsersDTO updateUsersById(int id, String username, String nickname, String avatar, String gender, String address, String phone) {
        // 查找用户，如果不存在则抛出异常
        User user = userRepository.findById(id).orElseThrow(() -> new IllegalStateException("用户不存在"));

        // 更新用户信息（不为null的属性）
        if(username != null){
            user.setUsername(username);
        }
        if(nickname != null){
            user.setNickname(nickname);
        }
        if(avatar != null){
            user.setAvatar(avatar);
        }
        if(gender != null){
            user.setGender(gender);
        }
        if(address != null){
            user.setAddress(address);
        }
        if(phone != null){
            user.setPhone(phone);
        }

        // 保存更新后的用户信息
        User updatedUser = userRepository.save(user);
        // 转换为 DTO 并返回
        return UserConverter.converterUsers(updatedUser);
    }

    @Override
    public List<UsersDTO> getUsersList(int status) {

        List<User> userList = userRepository.findAll();

        if(status == 1){// 获取所有可用用户信息(去除列表中所有status为-1的用户信息)
            userList.removeIf(user -> user.getStatus() == -1);
        }
        return UserConverter.converterUsersList(userList);
    }

    @Override
    public UsersDTO updateUserRole(int id, Byte role) {
        // 查找用户，如果不存在则抛出异常
        User user = userRepository.findById(id).orElseThrow(() -> new IllegalStateException("用户不存在"));

        if (role !=0 && role !=1 && role !=2)
            throw new IllegalStateException("用户角色非法");
        // 更新用户角色
        user.setRole(role);

        // 保存更新后的用户信息
        User updatedUser = userRepository.save(user);
        // 转换为 DTO 并返回
        return UserConverter.converterUsers(updatedUser);
    }

    @Override
    public UsersDTO loginByWechat(String code) {
        // 1. 通过code获取openid等信息
        Map<String, String> wxSession = wxApiUtil.code2Session(code);
        String openid = wxSession.get("openid");
        String sessionKey = wxSession.get("session_key");
        String unionid = wxSession.get("unionid");

        // 2. 查找用户是否存在
        Optional<User> existingUser = userRepository.findByOpenid(openid);
        User user;

        if (existingUser.isPresent()) {
            // 3. 用户存在，更新登录信息
            user = existingUser.get();
            user.setSessionKey(sessionKey);
            user.setLastLoginTime(Instant.now());
        } else {
            // 4. 用户不存在，创建新用户
            user = new User();
            user.setOpenid(openid);
            user.setUnionid(unionid);
            user.setSessionKey(sessionKey);
            user.setLoginType((byte)2); // 微信登录
            user.setRole((byte)1); // 普通用户
            user.setStatus((byte)1); // 正常状态
            user.setCreateTime(Instant.now());
            user.setLastLoginTime(Instant.now());
            user.setPassword("wx_" + openid); // 设置默认密码
            user.setGender("男"); // 设置默认性别
            user.setUsername("wx_" + openid); // 设置默认用户名
            user.setNickname("微信用户"); // 设置默认昵称
            user.setAvatar(""); // 设置默认头像
            user.setAddress(""); // 设置默认地址
            user.setPhone(""); // 设置默认手机号
            user.setToken(""); // 设置默认token
            user.setWxAvatar(""); // 设置默认微信头像
            user.setWxNickname(""); // 设置默认微信昵称
            user.setWxGender((byte)0); // 设置默认微信性别
        }

        // 5. 保存用户信息
        User savedUser = userRepository.save(user);

        // 6. 生成token并保存
        String token = com.example.health_life.util.JwtUtil.createToken(savedUser.getId());
        savedUser.setToken(token);
        userRepository.save(savedUser); // 可选：同步保存token到数据库

        UsersDTO dto = UserConverter.converterUsers(savedUser);
        dto.setToken(token); // 确保DTO有token
        return dto;
    }

    @Override
    public UsersDTO bindWechatAccount(Integer userId, String code) {
        // 1. 查找用户
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new IllegalStateException("用户不存在"));

        // 2. 通过code获取openid等信息
        Map<String, String> wxSession = wxApiUtil.code2Session(code);
        String openid = wxSession.get("openid");
        String sessionKey = wxSession.get("session_key");
        String unionid = wxSession.get("unionid");

        // 3. 检查openid是否已被绑定
        Optional<User> existingUser = userRepository.findByOpenid(openid);
        if (existingUser.isPresent() && !existingUser.get().getId().equals(userId)) {
            throw new IllegalStateException("该微信账号已被其他用户绑定");
        }

        // 4. 更新用户微信信息
        user.setOpenid(openid);
        user.setUnionid(unionid);
        user.setSessionKey(sessionKey);
        user.setLoginType((byte)2); // 微信登录
        user.setLastLoginTime(Instant.now());

        // 5. 保存更新后的用户信息
        User updatedUser = userRepository.save(user);

        // 6. 生成token并保存
        String token = com.example.health_life.util.JwtUtil.createToken(updatedUser.getId());
        updatedUser.setToken(token);
        userRepository.save(updatedUser); // 可选：同步保存token到数据库

        UsersDTO dto = UserConverter.converterUsers(updatedUser);
        dto.setToken(token); // 确保DTO有token
        return dto;
    }

    @Override
    public UsersDTO unbindWechatAccount(Integer userId) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new IllegalStateException("用户不存在"));
        
        // 清除微信相关信息
        user.setOpenid(null);
        user.setUnionid(null);
        user.setSessionKey(null);
        user.setWxAvatar(null);
        user.setWxNickname(null);
        user.setWxGender(null);
        user.setLoginType((byte)1); // 改回账号密码登录
        
        User updatedUser = userRepository.save(user);
        return UserConverter.converterUsers(updatedUser);
    }

    @Override
    public UsersDTO getUserByOpenid(String openid) {
        User user = userRepository.findByOpenid(openid)
                .orElseThrow(() -> new IllegalStateException("用户不存在"));
        return UserConverter.converterUsers(user);
    }

    @Override
    public UsersDTO updateUserStatus(int id, Byte status) {
        User user = userRepository.findById(id)
                .orElseThrow(() -> new IllegalStateException("用户不存在: " + id));
        
        // 校验 status 是否为 0 (禁用) 或 1 (正常)
        // 允许 status 为 -1 (已删除) 以保持与现有 deleteUsers 的某种一致性，尽管此方法主要用于 0 和 1
        if (status != null && (status == 0 || status == 1 || status == -1)) { 
            user.setStatus(status);
        } else {
            throw new IllegalArgumentException("无效的用户状态值: " + status + "。只接受 0 (禁用), 1 (正常), 或 -1 (删除).");
        }
        
        User updatedUser = userRepository.save(user);
        return UserConverter.converterUsers(updatedUser);
    }

    @Override
    public UsersDTO adminLogin(String username, String password) {
        System.out.println("Attempting admin login for username: " + username);

        List<User> users = userRepository.findByUsername(username);
        if (users.isEmpty()) {
            System.err.println("Admin login failed: Username '" + username + "' not found.");
            throw new IllegalStateException("用户名不存在");
        }

        User user = users.get(0);

        if (!user.getPassword().equals(password)) {
            System.err.println("Admin login failed: Password mismatch for username '" + username + "'.");
            throw new IllegalStateException("密码错误");
        }

        if (user.getRole() != 0) {
            System.err.println("Admin login failed: User '" + username + "' is not an admin. Role: " + user.getRole());
            throw new IllegalStateException("该用户不是管理员");
        }

        if (user.getStatus() != 1) {
            System.err.println("Admin login failed: User '" + username + "' status is not active. Status: " + user.getStatus());
            throw new IllegalStateException("该用户已被禁用或删除");
        }

        System.out.println("Admin login successful for username: " + username);
        user.setLastLoginTime(Instant.now());

        // 6. 生成新token
        String token = com.example.health_life.util.JwtUtil.createToken(user.getId());
        user.setToken(token);

        // 7. 保存用户信息
        User savedUser = userRepository.save(user);

        // 8. 转换为DTO并返回
        UsersDTO dto = UserConverter.converterUsers(savedUser);
        dto.setToken(token);
        return dto;
    }
}
